home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
SNNSV32.ZIP
/
SNNSv3.2
/
kernel
/
sources
/
kr_io.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-25
|
80KB
|
3,169 lines
/*****************************************************************************
FILE : kr_io.c
SHORTNAME : kr_io.c
SNNS VERSION : 3.2
PURPOSE : SNNS-Kernel User Interface File I/O
NOTES :
AUTHOR : Niels Mache
DATE : 28.05.90
CHANGED BY : Michael Vogt, Guenter Mamier
IDENTIFICATION : @(#)kr_io.c 1.30 4/18/94
SCCS VERSION : 1.30
LAST CHANGE : 4/18/94
Copyright (c) 1990-1994 SNNS Group, IPVR, Univ. Stuttgart, FRG
******************************************************************************/
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include <memory.h>
#include <stdarg.h>
#include <stdio.h>
#include "kr_typ.h" /* Kernel Types and Constants */
#include "kr_const.h" /* Constant Declarators for SNNS-Kernel */
#include "kr_def.h" /* Default Values */
#include "kr_ui.h" /* Interface Functions */
#include "kernel.h" /* Function Prototypes */
#include "kr_mac.h" /* Kernel Macros */
#include "version.h" /* Version and Patchlevel */
#include "dlvq_learn.h"
#include "kr_io.ph" /* Function Prototypes */
#include "kr_newpattern.h" /*pattern handling functions */
#ifdef ultrix
#define retchk( ret_code ) if ((ret_code) == EOF) return( KRERR_IO )
#define RETCHKGTO( ret_code ) if ((ret_code) == EOF) goto end
#else
#define retchk( ret_code ) if ((ret_code) < 0) return( KRERR_IO )
#define RETCHKGTO( ret_code ) if ((ret_code) < 0) goto end
#endif
/*****************************************************************************
FUNCTION : mstrcat
PURPOSE :
NOTES : mstrcat is called
mstrcat( dest, src1, src2, ... , (char *) 0 )
RETURNS :
UPDATE :
******************************************************************************/
static void mstrcat(char *va_alist,...)
{
va_list args;
char *dest, *src;
va_start( args, va_alist );
if ((dest = va_alist) == (char *) 0) return;
while ((src = va_arg( args, char * )) != (char *) 0)
strcat( dest, src );
va_end( args );
}
/*****************************************************************************
FUNCTION : mstrcpy
PURPOSE :
NOTES : mstrcpy is called
mstrcpy ( dest, src1, src2, ... , (char *) 0 )
RETURNS :
UPDATE :
******************************************************************************/
static void mstrcpy(char *va_alist,...)
{
va_list args;
char *dest, *src;
va_start( args, va_alist );
if ((dest = va_alist) == (char *) 0) return;
if ((src = va_arg( args, char * )) == (char *) 0) return;
while( *src != EOS )
*dest++ = *src++;
while ((src = va_arg( args, char * )) != (char *) 0)
{
while( *src != EOS )
*dest++ = *src++;
}
va_end( args );
*dest = EOS;
}
/*****************************************************************************
FUNCTION : krio_getIOVersion
PURPOSE : returns the current file I/O version number
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static char *krio_getIOVersion(void)
{
static char io_version[128];
strcpy( io_version, NETFILE_VERSION );
#ifdef KERNEL3D
strcat( io_version, KERNEL3D_NETFILE_VERSION );
#endif
return( io_version );
}
/*#################################################
GROUP: Kernel File Output Functions
#################################################*/
/*****************************************************************************
FUNCTION : krio_writeHeader
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeHeader(char *version, char *net_name)
{
long clock;
int err;
int no_of_sites,
no_of_STable_entries,
no_of_FTable_entries;
krui_getNetInfo( &no_of_sites, &NoOfLinks, &no_of_STable_entries,
&no_of_FTable_entries );
units_have_sites = no_of_sites > 0;
clock = 1;
(void) time( (time_t *) &clock);
err = fprintf( file_out, "%s %s\n%s %s\n%s : ",
title[0], version, title[1],
ctime( (time_t *) &clock), title[2] );
retchk( err );
if (net_name == NULL)
err = fprintf( file_out, "UNTITLED\n" );
else
err = fprintf( file_out, "%s\n", net_name );
retchk( err );
err = fprintf( file_out, "%s :\n%s : %i\n%s : %i\n%s : %i\n%s : %i\n",
title[14],
title[3], NoOfUnits,
title[4], NoOfLinks,
title[5], no_of_FTable_entries,
title[6], no_of_STable_entries );
retchk( err );
err = fprintf( file_out, "\n\n%s : %s\n",
title[7], krui_getLearnFunc() );
retchk( err );
err = fprintf( file_out, "%s : %s\n",
title[16], krui_getUpdateFunc() );
retchk( err );
return( KRERR_NO_ERROR );
}
/*****************************************************************************
FUNCTION : krio_cutTrailingZeros
PURPOSE : cut all trailing '0'
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_cutTrailingZeros(char *string)
{
int j;
if (*string == EOS) return;
for (j = strlen( string ) - 1; ((string[j] == '0') && (j > 0)); j--) {}
if (string[j] == '.')
string[j] = EOS;
else
string[j + 1] = EOS;
}
/*****************************************************************************
FUNCTION : krio_repchar
PURPOSE :
NOTES :
RETURNS :
UPDATE :
****************************************************************************/
static char *krio_repchar(char c, int N)
{
int i;
static char str[180];
if ( (N - 1) >= sizeof (str)) N = sizeof (str) - 1;
for (i = 0; i < N; i++)
str[ i ] = c;
str[N] = 0;
return( str );
}
/*****************************************************************************
FUNCTION : krio_stringLimits
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_stringLimits(void)
{
char *symbol, *name;
int sym_type,
unit_no,
len, i1, i2, i3, i4, i5,
subnet_no, layer_no;
FlintType act, bias;
int st;
char *def_act_func, *def_out_func;
struct PosType pos;
bool neg1, neg2, neg3;
unit_name_len = site_name_len = type_name_len = 0;
out_func_len = act_func_len = site_func_len = 0;
def_out_func_len = def_act_func_len = 0;
/* get default subnet and layer numbers */
krui_getUnitDefaults( &act, &bias, &st, &subnet_no, &layer_no,
&def_act_func, &def_out_func );
if ( krui_getFirstSymbolTableEntry( &symbol, &sym_type) ) {
do {
len = strlen( symbol );
switch (sym_type) {
case UNIT_SYM:
unit_name_len = Max( unit_name_len, len );
break;
case SITE_SYM:
site_name_len = Max( site_name_len, len );
break;
case FTYPE_UNIT_SYM:
type_name_len = Max( type_name_len, len );
}
}
while ( krui_getNextSymbolTableEntry( &symbol, &sym_type ) );
}
unit_no = krui_getFirstUnit();
do {
symbol = krui_getUnitOutFuncName( unit_no );
if (strcmp( symbol, def_out_func ) != 0)
out_func_len = Max( out_func_len, strlen( symbol ));
symbol = krui_getUnitActFuncName( unit_no );
if (strcmp( symbol, def_act_func ) != 0)
act_func_len = Max( act_func_len, strlen( symbol ));
}
while ((unit_no = krui_getNextUnit() ) != 0);
def_out_func_len = strlen( def_out_func );
def_act_func_len = strlen( def_act_func );
if (krui_getFirstSiteTableEntry( &name, &symbol )) {
do
site_func_len = Max( site_func_len, strlen( symbol ));
while (krui_getNextSiteTableEntry( &name, &symbol ));
}
unit_no = krui_getFirstUnit();
neg1 = neg2 = neg3 = is_subnet_info =
is_layer_info = FALSE;
i1 = i2 = i3 = 0;
do {
krui_getUnitPosition( unit_no, &pos );
i1 = Max( i1, abs( pos.x ) );
i1 = Max( i1, abs( pos.y ) );
if (pos.x < 0) neg1 = TRUE;
if (pos.y < 0) neg1 = TRUE;
i5 = krui_getUnitSubnetNo( unit_no );
if (i5 < 0) neg2 = TRUE;
i2 = Max( i2, abs( i5 ) );
if (i2 != subnet_no) is_subnet_info = TRUE;
i4 = (int) krui_getUnitLayerNo( unit_no );
if (i4 < 0) neg2 = TRUE;
i3 = Max( i3, abs( i4 ) );
if (i3 != layer_no) is_layer_info = TRUE;
}
while ( (unit_no = krui_getNextUnit() ) > 0);
pos_no_len = 1;
while ( (i1 /= 10) != 0)
++pos_no_len;
if (neg1) pos_no_len++;
subnet_no_len = 1;
while ( (i2 /= 10) != 0)
++subnet_no_len;
if (neg2) subnet_no_len++;
layer_no_len = 1;
while ( (i3 /= 10) != 0)
++layer_no_len;
if (neg3) layer_no_len++;
len = NoOfUnits;
unit_no_len = 1;
while ( (len /= 10) != 0)
++unit_no_len;
}
/*****************************************************************************
FUNCTION : krio_fmtShapeing
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_fmtShapeing(int choose_me)
{
static char *formats[] = {
/* 0 */ "site name",
/* 1 */ "sites",
/* 2 */ "unitName",
/* 3 */ "typeName",
/* 4 */ "name",
/* 5 */ "site function",
/* 6 */ "act func",
/* 7 */ "out func",
/* 8 */ "no.",
/* 9 */ "target",
/* 10 */ "act",
/* 11 */ "bias",
/* 12 */ "position",
/* 13 */ "site",
/* 14 */ " source:weight",
/* 15 */ "subnet",
/* 16 */ "layer",
/* 17 */ " unitNo."
};
char fmt [ MAX_LIN_LEN ],
aux [ MAX_LIN_LEN ];
int len, len1, act_len, out_len;
switch( choose_me )
{
case SITE_DEF:
if (site_name_len + site_func_len + 5 > MAX_LIN_LEN)
return( KRERR_SAVE_LINE_LEN );
len = Max( site_name_len, strlen( formats[ 0 ] ) );
sprintf( aux, "%d", len );
mstrcpy( fmt_shape1, " %-", aux, "s | %s\n", (char *) 0 );
mstrcpy( fmt, " %-", aux, "s | ", (char *) 0 );
sprintf( fmt_hdr1, fmt, formats[ 0 ] );
mstrcat( fmt_hdr1, formats[ 5 ], "\n", (char *) 0 );
mstrcpy( fmt_hdr2 ,krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( site_func_len, strlen( formats[ 6 ] ));
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "\n", (char *) 0 );
break;
case TYPE_DEF:
if (act_func_len == 0) act_len = def_act_func_len;
else act_len = act_func_len;
if (out_func_len == 0) out_len = def_out_func_len;
else out_len = out_func_len;
len = act_len + out_len + site_name_len + type_name_len + 11;
if (len > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
len = Max( type_name_len, strlen( formats[ 4 ] ));
len1 = len + 2;
sprintf( aux, "%d", len );
mstrcpy( fmt_shape1, "%-", aux, "s |", (char *) 0 );
sprintf( fmt_hdr1, fmt_shape1, formats[ 4 ] );
mstrcpy( fmt_hdr2, krio_repchar( '-', len + 1 ), "|", (char *) 0 );
len = Max( act_len, strlen( formats[ 6 ] ) );
len1 = len1 + len + 3;
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, fmt, formats[ 6 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( out_len, strlen( formats[ 7 ] ) );
len1 = len1 + len + 3;
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, fmt, formats[ 7 ] );
mstrcat( fmt_hdr1, aux, formats[1], "\n", (char *) 0 );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
mstrcpy( fmt_blank, ",\n", krio_repchar( ' ', len1 ), (char *) 0 );
len = Max( site_name_len, strlen( formats[ 1 ] ) );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "\n", (char *) 0 );
break;
case DEFAULT_DEF:
len = Max( 8, strlen( formats[ 10 ] ) );
len1 = len + 2;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
strcpy( fmt_shape1, "%8.5f |" );
sprintf( aux, "%d", len );
mstrcpy( fmt, "%-", aux, "s |", (char *) 0 );
sprintf( fmt_hdr1, fmt, formats[ 10 ] );
mstrcpy( fmt_hdr2, krio_repchar( '-', len + 1 ), "|", (char *) 0 );
len = Max( 8, strlen( formats[ 11 ] ) );
len1 = len1 + len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
strcat( fmt_shape1, " %8.5f |" );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
sprintf( aux, fmt, formats[ 11 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len1 = len1 + 5;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
strcat( fmt_shape1, " %s |" );
strcat( fmt_hdr1, " st |" );
strcat( fmt_hdr2, "----|" );
len = Max( subnet_no_len, strlen( formats[ 15 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcat( fmt_shape1, " %", aux, "d |", (char *) 0 );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
sprintf( aux, fmt, formats[ 15 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( layer_no_len, strlen( formats[ 16 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcat( fmt_shape1, " %", aux, "d |", (char *) 0 );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
sprintf( aux, fmt, formats[ 16 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( def_act_func_len, strlen( formats[ 6 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s | ", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, fmt, formats[ 6 ] );
mstrcat( fmt_hdr1, aux, formats[7], "\n", (char *) 0 );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( def_out_func_len, strlen( formats[ 7 ] ) );
len1 += len + 1;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcat( fmt_shape1, "%-", aux, "s \n", (char *) 0 );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 1 ), "\n", (char *) 0 );
break;
case UNIT_DEF:
len = Max( unit_no_len, strlen( formats[ 8 ] ) );
len1 = len + 2;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcpy( fmt_shape1, "%", aux, "d |", (char *) 0 );
mstrcpy( fmt, "%", aux, "s |", (char *) 0 );
sprintf( fmt_hdr1, fmt, formats[ 8 ] );
mstrcpy( fmt_hdr2, krio_repchar( '-', len + 1 ), "|", (char *) 0);
len = Max( type_name_len, strlen( formats[ 3 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, fmt, formats[ 3 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( unit_name_len, strlen( formats[ 2 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, fmt, formats[ 2 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( 8, strlen( formats[ 10 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
strcat( fmt_shape1, " %8.5f |" );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
sprintf( aux, fmt, formats[ 10 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( 8, strlen( formats[ 11 ] ) );
len1 = len1 + len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
strcat( fmt_shape1, " %8.5f |" );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
sprintf( aux, fmt, formats[ 11 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len1 += 5;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
strcat( fmt_shape1, " %s |" );
strcat( fmt_hdr1, " st |" );
strcat( fmt_hdr2, "----|" );
#ifndef KERNEL3D
len = Max( pos_no_len * 2 + 1, strlen( formats[ 12 ] ) );
#else
len = Max( pos_no_len * 3 + 2, strlen( formats[ 12 ] ) );
#endif
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", pos_no_len );
mstrcpy( fmt, " %", aux, "d,", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, "%d", pos_no_len );
mstrcpy( fmt, "%", aux, "d", (char *) 0 );
#ifdef KERNEL3D
strcat( fmt_shape1, fmt );
sprintf( aux, "%d", pos_no_len );
mstrcpy( fmt, ",%", aux, "d", (char *) 0 );
#endif
#ifndef KERNEL3D
if ((pos_no_len * 2 + 1) < len)
strcat( fmt, krio_repchar( ' ', len - (pos_no_len * 2 + 1)) );
#else
if ((pos_no_len * 3 + 2) < len)
strcat( fmt, krio_repchar( ' ', len - (pos_no_len * 3 + 2)) );
#endif
strcat( fmt, " |" );
strcat( fmt_shape1, fmt );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
sprintf( aux, fmt, formats[ 12 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( act_func_len, strlen( formats[ 6 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
strcpy( fmt_shape2, fmt_shape1 );
strcat( fmt_shape2, "||" );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, fmt, formats[ 6 ] );
strcat( fmt_hdr1, aux );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
len = Max( out_func_len, strlen( formats[ 7 ] ) );
len1 += len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s | ", (char *) 0 );
strcat( fmt_shape1, fmt );
sprintf( aux, fmt, formats[ 7 ] );
mstrcat( fmt_hdr1, aux, formats[1], "\n", (char *) 0 );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
mstrcpy( fmt_blank, ",\n", krio_repchar( ' ', len1 ), (char *) 0 );
len = Max( site_name_len, strlen( formats[ 1 ] ) );
len1 += len + 2;
if (len1 + len > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "\n", (char *) 0 );
break;
case CONNECT_DEF:
sprintf( aux, "%d", unit_no_len );
mstrcpy( fmt_shape3, " %", aux, "d:%8.5f", (char *) 0 );
len = Max( unit_no_len, strlen( formats[ 9 ] ) );
len1 = len + 2;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcpy( fmt_shape1, "%", aux, "d |", (char *) 0 );
mstrcpy( fmt, "%", aux, "s |", (char *) 0 );
sprintf( fmt_hdr1, fmt, formats[ 9 ] );
mstrcpy( fmt_hdr2, krio_repchar( '-', len + 1 ), "|", (char *) 0 );
strcpy( fmt_shape2, krio_repchar( ' ', len1 ) );
len = Max( site_name_len, strlen( formats[ 13 ] ) );
len1 = len1 + len + 3;
if (len1 > MAX_LIN_LEN) return( KRERR_SAVE_LINE_LEN );
sprintf( aux, "%d", len );
mstrcpy( fmt, " %-", aux, "s |", (char *) 0 );
strcat( fmt_shape1, fmt );
strcat( fmt_shape2, fmt );
sprintf( aux, fmt, formats[ 13 ] );
mstrcat( fmt_hdr1, aux, formats[14], "\n", (char *) 0 );
mstrcat( fmt_hdr2, krio_repchar( '-', len + 2 ), "|", (char *) 0 );
mstrcpy( fmt_blank, "\n", krio_repchar( ' ', len1 ), (char *) 0 );
if ((len1 + unit_no_len + 14) > MAX_LIN_LEN)
return( KRERR_SAVE_LINE_LEN );
max_connects_per_line = (BEST_LINE_LEN - len1) / (unit_no_len + 11);
mstrcat( fmt_hdr2,
krio_repchar( '-',
(unit_no_len + 11) * max_connects_per_line ),
"\n", (char *) 0 );
break;
case SUBNET_DEF:
len = Max( subnet_no_len, strlen( formats[ 15 ] ) );
len1 = len + 1;
sprintf( aux, "%d", len );
mstrcpy( fmt_shape1, "\n%", aux, "d |", (char *) 0 );
sprintf( aux, "%d", len );
mstrcpy( fmt, "%", aux, "s |", (char *) 0 );
sprintf( fmt_hdr1, fmt, formats[ 15 ] );
strcat( fmt_hdr1, formats[17] );
mstrcpy( fmt_hdr2, "\n", krio_repchar( '-', len1 ), "|", (char *) 0 );
mstrcpy( fmt_blank, "\n", krio_repchar( ' ', len1 + 1 ), (char *) 0 );
sprintf( aux, "%d", unit_no_len );
mstrcat( fmt_shape1, " %", aux, "d", (char *) 0 );
mstrcpy( fmt_shape2, " %", aux, "d", (char *) 0 );
max_subnets_per_line = (BEST_LINE_LEN - len1 - 1) / (unit_no_len + 2);
strcat( fmt_hdr2, krio_repchar( '-', (unit_no_len + 2)
* max_subnets_per_line ) );
break;
case LAYER_DEF:
len = Max( layer_no_len, strlen( formats[ 16 ] ) );
len1 = len + 1;
sprintf( aux, "%d", len );
mstrcpy( fmt_shape1, "\n%", aux, "d |", (char *) 0 );
mstrcpy( fmt, "%", aux, "s |", (char *) 0 );
sprintf( fmt_hdr1, fmt, formats[ 16 ] );
strcat( fmt_hdr1, formats[17] );
mstrcpy( fmt_hdr2, "\n", krio_repchar( '-', len1 ), "|", (char *) 0 );
mstrcpy( fmt_blank, "\n", krio_repchar( ' ', len1 + 1 ), (char *) 0 );
sprintf( aux, "%d", unit_no_len );
mstrcat( fmt_shape1, " %", aux, "d", (char *) 0 );
mstrcpy( fmt_shape2, " %", aux, "d", (char *) 0 );
max_layers_per_line = (BEST_LINE_LEN - len1 - 1) / (unit_no_len + 2);
strcat( fmt_hdr2, krio_repchar( '-', (unit_no_len + 2)
* max_layers_per_line ) );
break;
}
return( 0 );
}
/*****************************************************************************
FUNCTION : krio_writeSiteDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeSiteDefinitions(void)
{
int err;
char *site_name,
*site_func;
if ( !krui_getFirstSiteTableEntry( &site_name, &site_func ) )
return( 0 );
err = krio_fmtShapeing( SITE_DEF );
retchk( err );
err = fprintf( file_out, "\n\n%s :\n\n", title[8] );
retchk( err );
err = fprintf( file_out, fmt_hdr1 );
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
do
{
err = fprintf( file_out, fmt_shape1,
site_name, site_func );
retchk( err );
}
while (krui_getNextSiteTableEntry( &site_name, &site_func ) );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
return( 0 );
}
/*****************************************************************************
FUNCTION : krio_writeTypeDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeTypeDefinitions(void)
{
int err;
bool second;
if ( !krui_setFirstFTypeEntry() )
return( 0 );
err = krio_fmtShapeing( TYPE_DEF );
retchk( err );
err = fprintf( file_out, "\n\n%s :\n\n", title[9] );
retchk( err );
err = fprintf( file_out, fmt_hdr1 );
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
do {
err = fprintf( file_out, fmt_shape1,
krui_getFTypeName(),
krui_getFTypeActFuncName(), krui_getFTypeOutFuncName() );
retchk( err );
if ( krui_setFirstFTypeSite() ) {
second = FALSE;
do {
if (second) {
err = fprintf( file_out, fmt_blank );
retchk( err );
}
err = fprintf( file_out, " %-s", krui_getFTypeSiteName() );
retchk( err );
second = TRUE;
}
while ( krui_setNextFTypeSite() );
}
err = fprintf( file_out, "\n" );
retchk( err );
}
while (krui_setNextFTypeEntry() );
err = fprintf( file_out, fmt_hdr2 );
if (err <= 0) return( err );
return( 0 );
}
/*****************************************************************************
FUNCTION : getTType
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static char *getTType(int st)
{
static char *ttype[] = { "-", "i", "o", "d", "h", "s" ,
"si", "so", "sh", "sd"};
switch ( st ) {
case INPUT:
return( ttype[1] );
case OUTPUT:
return( ttype[2] );
case DUAL:
return( ttype[3] );
case HIDDEN:
return( ttype[4] );
case SPECIAL:
return( ttype[5] );
case SPECIAL_I:
return( ttype[6] );
case SPECIAL_O:
return( ttype[7] );
case SPECIAL_H:
return( ttype[8] );
case SPECIAL_D:
return( ttype[9] );
default:
return( ttype[0] );
}
}
/*****************************************************************************
FUNCTION : krio_writeDefaultDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeDefaultDefinitions(void)
{
int err;
FlintType act, bias;
int st, subnet_no, layer_no;
char *act_func, *out_func;
err = krio_fmtShapeing( DEFAULT_DEF );
retchk( err );
err = fprintf( file_out, "\n\n%s :\n\n", title[13] );
retchk( err );
err = fprintf( file_out, fmt_hdr1 );
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
krui_getUnitDefaults( &act, &bias, &st, &subnet_no, &layer_no,
&act_func, &out_func );
if ((act_func != NULL) && (out_func != NULL)) {
err = fprintf( file_out, fmt_shape1, act, bias, getTType( st ),
subnet_no, layer_no, act_func, out_func );
}
else {
err = fprintf( file_out, fmt_shape1, act, bias, getTType( st ),
subnet_no, layer_no, " ", " " );
}
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
return( 0 );
}
/*****************************************************************************
FUNCTION : krio_writeUnitDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeUnitDefinitions(void)
{
static char *blank = "\0";
struct PosType pos;
char *u_type,
*u_name,
*act_func,
*act_func_def,
*out_func_def,
*out_func;
bool no_Ftype, second,
writeUnitActFuncName, writeUnitOutFuncName;
int err,
unit_no,
u_no,
st_def, subnet_no, layer_no;
FlintType act_def, bias_def;
if (NoOfUnits <= 0) return( KRERR_NO_ERROR );
err = krio_fmtShapeing( UNIT_DEF );
retchk( err );
err = fprintf( file_out, "\n\n%s :\n\n", title[10] );
retchk( err );
err = fprintf( file_out, fmt_hdr1 );
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
krui_getUnitDefaults( &act_def, &bias_def, &st_def, &subnet_no, &layer_no,
&act_func_def, &out_func_def );
unit_no = krui_getFirstUnit();
u_no = 1;
do {
krui_getUnitPosition( unit_no, &pos );
if ( (u_name = krui_getUnitName( unit_no )) == NULL)
u_name = blank;
if ( (u_type = krui_getUnitFTypeName( unit_no )) == NULL)
{ /* no ftype */
no_Ftype = TRUE;
act_func = krui_getUnitActFuncName( unit_no );
out_func = krui_getUnitOutFuncName( unit_no );
writeUnitActFuncName = strcmp( act_func, act_func_def) != 0;
writeUnitOutFuncName = strcmp( out_func, out_func_def) != 0;
if (!writeUnitActFuncName && !writeUnitOutFuncName) {
#ifndef KERNEL3D
err = fprintf( file_out, fmt_shape2,
u_no, blank, u_name,
krui_getUnitActivation( unit_no ),
krui_getUnitBias( unit_no ),
getTType( krui_getUnitTType( unit_no ) ),
pos.x, pos.y );
#else
err = fprintf( file_out, fmt_shape2,
u_no, blank, u_name,
krui_getUnitActivation( unit_no ),
krui_getUnitBias( unit_no ),
getTType( krui_getUnitTType( unit_no ) ),
pos.x, pos.y, pos.z );
#endif
}
else {
if (!writeUnitActFuncName) act_func = blank;
if (!writeUnitOutFuncName) out_func = blank;
#ifndef KERNEL3D
err = fprintf( file_out, fmt_shape1,
u_no, blank, u_name,
krui_getUnitActivation( unit_no ),
krui_getUnitBias( unit_no ),
getTType( krui_getUnitTType( unit_no ) ),
pos.x, pos.y, act_func, out_func );
#else
err = fprintf( file_out, fmt_shape1,
u_no, blank, u_name,
krui_getUnitActivation( unit_no ),
krui_getUnitBias( unit_no ),
getTType( krui_getUnitTType( unit_no ) ),
pos.x, pos.y, pos.z, act_func, out_func );
#endif
}
}
else {
#ifndef KERNEL3D
err = fprintf( file_out, fmt_shape2,
u_no, u_type, u_name,
krui_getUnitActivation( unit_no ),
krui_getUnitBias( unit_no ),
getTType( krui_getUnitTType( unit_no ) ),
pos.x, pos.y );
#else
err = fprintf( file_out, fmt_shape2,
u_no, u_type, u_name,
krui_getUnitActivation( unit_no ),
krui_getUnitBias( unit_no ),
getTType( krui_getUnitTType( unit_no ) ),
pos.x, pos.y, pos.z );
#endif
no_Ftype = FALSE;
}
retchk( err );
if ( no_Ftype ) {
if ( krui_setFirstSite() ) {
second = FALSE;
do {
if (second) {
err = fprintf( file_out, fmt_blank );
retchk( err );
}
err = fprintf( file_out, " %-s", krui_getSiteName() );
retchk( err );
second = TRUE;
}
while ( krui_setNextSite() );
}
}
err = fprintf( file_out, "\n" );
retchk( err );
u_no++;
}
while ( (unit_no = krui_getNextUnit() ) > 0);
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
return( KRERR_NO_ERROR );
}
/*****************************************************************************
FUNCTION : krio_writeTimeDelayDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeTimeDelayDefs(void)
{
struct Unit *unit_ptr;
int err,
unit_no,
u_no,
lln,
lun,
toff,
soff,
conn_type;
if (NoOfUnits <= 0)
return( 0 );
if ((strcmp (krui_getLearnFunc(), "TimeDelayBackprop") == 0) ||
(strcmp (krui_getLearnFunc(), "TDBP_McClelland") == 0)) {
err = fprintf( file_out, "\n\n%s :\n\n", title[18] );
retchk( err );
err = fprintf (file_out, "%s\n", headers[8]);
retchk (err);
err = fprintf (file_out, "-----|-----|-----|------|------|-------\n");
retchk (err);
unit_no = krui_getFirstUnit ();
u_no = 1;
do {
unit_ptr = kr_getUnitPtr (unit_no);
lln = unit_ptr->lln;
lun = unit_ptr->lun;
toff = unit_ptr->TD.target_offset;
soff = unit_ptr->TD.source_offset;
conn_type = unit_ptr->TD.td_connect_typ;
err = fprintf (file_out, "%4d |%4d |%4d |%5d |%5d |%6d\n",
u_no, lln, lun, toff, soff, conn_type);
retchk (err);
unit_no = krui_getNextUnit ();
u_no++;
} while (unit_no != 0);
err = fprintf(file_out, "-----|-----|-----|------|------|-------\n");
retchk (err);
}
return (KRERR_NO_ERROR);
}
/*****************************************************************************
FUNCTION : krio_writeSourcesAndWeights
PURPOSE : write link weights
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeSourcesAndWeights(void)
{
bool second;
int i, err,
source_unit;
FlintType weight;
i = 0;
source_unit = krui_getFirstPredUnit( &weight );
second = FALSE;
do {
if (second) {
err = fprintf( file_out, "," );
retchk( err );
}
if (++i > max_connects_per_line) {
i = 1;
err = fprintf( file_out, fmt_blank );
retchk( err );
}
err = fprintf( file_out, fmt_shape3, source_unit, weight );
retchk( err );
second = TRUE;
}
while ( (source_unit = krui_getNextPredUnit( &weight )) > 0);
err = fprintf( file_out, "\n" );
retchk( err );
return( KRERR_NO_ERROR );
}
/*****************************************************************************
FUNCTION : krio_writeConnectionDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeConnectionDefs(void)
{
bool second;
int target_unit, unit_no,
err;
FlintType weight;
if (NoOfLinks == 0) return( 0 );
err = krio_fmtShapeing( CONNECT_DEF );
retchk( err );
err = fprintf( file_out, "\n\n%s :\n\n", title[11] );
retchk( err );
err = fprintf( file_out, fmt_hdr1 );
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
unit_no = krui_getFirstUnit();
target_unit = 1;
do {
switch (krui_getUnitInputType( unit_no )) {
case DIRECT_LINKS:
err = fprintf( file_out, fmt_shape1, target_unit, " ");
retchk( err );
err = krio_writeSourcesAndWeights();
retchk( err );
break;
case SITES:
krui_setFirstSite();
second = FALSE;
do {
if (krui_getFirstPredUnit( &weight ) > 0) {
if (second) {
err = fprintf( file_out, fmt_shape2, krui_getSiteName() );
retchk( err );
}
else {
err = fprintf( file_out, fmt_shape1, target_unit,
krui_getSiteName() );
retchk( err );
}
err = krio_writeSourcesAndWeights();
retchk( err );
second = TRUE;
}
}
while ( krui_setNextSite() );
break;
}
target_unit++;
}
while ( (unit_no = krui_getNextUnit()) > 0 );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
return( KRERR_NO_ERROR );
}
/*****************************************************************************
FUNCTION : krio_writeSubnetDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeSubnetDefs(void)
{
struct Unit *unit_ptr,
*unit_ptr2;
int i, k, elem_no, err, dummy2, def_subnet_no;
short subnet_no;
FlintType dummy1;
char *dummy3;
if (!is_subnet_info) return( 0 );
err = krio_fmtShapeing( SUBNET_DEF );
retchk( err );
err = fprintf( file_out, "\n\n%s :\n\n", title[12] );
retchk( err );
err = fprintf( file_out, fmt_hdr1 );
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
/* get default subnet number */
krui_getUnitDefaults( &dummy1, &dummy1, &dummy2, &def_subnet_no, &dummy2,
&dummy3, &dummy3 );
/* clear refresh flags */
FOR_ALL_UNITS( unit_ptr )
unit_ptr->flags &= ~UFLAG_REFRESH;
for (i = MinUnitNo, unit_ptr = unit_array + MinUnitNo;
i <= MaxUnitNo;
i++, unit_ptr++)
if (!UNIT_REFRESHED( unit_ptr ) && UNIT_IN_USE( unit_ptr ))
{ /* unit is in use and 'fresh' */
subnet_no = unit_ptr->subnet_no;
if (subnet_no == def_subnet_no)
continue;
err = fprintf( file_out, fmt_shape1, subnet_no, i);
retchk( err );
elem_no = 0;
for (k = i + 1, unit_ptr2 = unit_ptr + 1;
k <= MaxUnitNo;
k++, unit_ptr2++ )
{
if (!UNIT_REFRESHED( unit_ptr ) && UNIT_IN_USE( unit_ptr ))
{ /* unit is in use and 'fresh' */
if (unit_ptr2->subnet_no == subnet_no) {
unit_ptr2->flags |= UFLAG_REFRESH;
err = fprintf( file_out, "," );
retchk( err );
if ( (++elem_no % max_subnets_per_line) == 0) {
err = fprintf( file_out, fmt_blank );
retchk( err );
}
err = fprintf( file_out, fmt_shape2, k);
retchk( err );
}
}
}
}
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
err = fprintf( file_out, "\n" );
retchk( err );
return( KRERR_NO_ERROR );
}
/*****************************************************************************
FUNCTION : krio_writeLayerDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static krui_err krio_writeLayerDefs(void)
{
struct Unit *unit_ptr,
*unit_ptr2;
int i, k, elem_no, err, dummy2, def_layer_no;
short layer_no;
FlintType dummy1;
char *dummy3;
if (!is_layer_info) return( KRERR_NO_ERROR );
err = krio_fmtShapeing( LAYER_DEF );
retchk( err );
err = fprintf( file_out, "\n\n%s :\n\n", title[15] );
retchk( err );
err = fprintf( file_out, fmt_hdr1 );
retchk( err );
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
/* get default layer number */
krui_getUnitDefaults( &dummy1, &dummy1, &dummy2, &dummy2, &def_layer_no,
&dummy3, &dummy3 );
/* clear refresh flags */
FOR_ALL_UNITS( unit_ptr )
unit_ptr->flags &= ~UFLAG_REFRESH;
for (i = MinUnitNo, unit_ptr = unit_array + MinUnitNo;
i <= MaxUnitNo;
i++, unit_ptr++)
if (!UNIT_REFRESHED( unit_ptr ) && UNIT_IN_USE( unit_ptr ))
{ /* unit is in use and 'fresh' */
layer_no = (int) unit_ptr->layer_no;
if (layer_no == def_layer_no)
continue;
err = fprintf( file_out, fmt_shape1, layer_no, i);
retchk( err );
elem_no = 0;
for (k = i + 1, unit_ptr2 = unit_ptr + 1;
k <= MaxUnitNo;
k++, unit_ptr2++ ) {
if (!UNIT_REFRESHED( unit_ptr ) && UNIT_IN_USE( unit_ptr ))
{ /* unit is in use and 'fresh' */
if ((int) unit_ptr2->layer_no == layer_no) {
unit_ptr2->flags |= UFLAG_REFRESH;
err = fprintf( file_out, "," );
retchk( err );
if ( (++elem_no % max_layers_per_line) == 0) {
err = fprintf( file_out, fmt_blank );
retchk( err );
}
err = fprintf( file_out, fmt_shape2, k);
retchk( err );
}
}
}
}
err = fprintf( file_out, fmt_hdr2 );
retchk( err );
err = fprintf( file_out, "\n" );
retchk( err );
return( KRERR_NO_ERROR );
}
#ifdef KERNEL3D
static krui_err writeXYTransTable(void)
{
int err;
int z_index;
if (transTableSize > 0) {
err = fprintf( file_out, "\n\n%s :\n\n", title[17]);
retchk( err );
err = fprintf( file_out, " delta x | delta y | z \n");
retchk( err );
err = fprintf( file_out, "---------|---------|---------\n");
retchk( err );
for (z_index = 0; z_index < transTableSize; z_index++) {
err = fprintf( file_out, "%8d |", transTable[z_index].x);
retchk( err );
err = fprintf( file_out, "%8d |", transTable[z_index].y);
retchk( err );
err = fprintf( file_out, "%8d \n", transTable[z_index].z);
retchk( err );
}
err = fprintf( file_out, "---------|---------|---------\n");
retchk( err );
err = fprintf( file_out, "\n" );
retchk( err );
}
return( KRERR_NO_ERROR );
}
#endif
/*****************************************************************************
FUNCTION : krio_saveNet
PURPOSE : write complete network to disk
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
krui_err krio_saveNet(char *filename, char *netname)
{
int err;
if (NoOfUnits == 0) return( KRERR_NO_UNITS ); /* no units defined */
if ((file_out = fopen( filename, "w" )) == NULL) {
err = KRERR_IO; /* file open error */
goto end;
}
kr_forceUnitGC(); /* do unit garbage-collection */
/* write file header */
err = krio_writeHeader( krio_getIOVersion(), netname );
/* calc. maximum string length of all identifiers */
krio_stringLimits();
if (err < 0) goto end;
err = krio_writeSiteDefinitions();
if (err < 0) goto end;
err = krio_writeTypeDefinitions();
if (err < 0) goto end;
err = krio_writeDefaultDefinitions();
if (err < 0) goto end;
err = krio_writeUnitDefinitions();
if (err < 0) goto end;
/*
err = krio_writeTopologicDef();
if (err < 0) goto end;
*/
err = krio_writeConnectionDefs();
if (err < 0) goto end;
err = krio_writeSubnetDefs();
if (err < 0) goto end;
err = krio_writeLayerDefs();
if (err < 0) goto end;
err = krio_writeTimeDelayDefs ();
if (err < 0) goto end;
#ifdef KERNEL3D
err = writeXYTransTable();
if (err < 0) goto end;
#endif
err = fclose( file_out );
end:
KernelErrorCode = err;
return( KernelErrorCode );
}
/*#################################################
GROUP: Kernel I/O Input Functions
#################################################*/
/*****************************************************************************
FUNCTION : skipComments
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool skipComments(void)
{
register int c;
while (TRUE) {
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
if (c != '#') break;
do
c = getc( file_in );
while (c != EOF && c != '\n');
if (c == '\n') lineno++;
}
if (c == EOF) return( FALSE );
ungetc( c, file_in );
return( TRUE );
}
/*****************************************************************************
FUNCTION : skipSpace
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool skipSpace(void)
{
register int c;
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
if (c == EOF) {
KernelErrorCode = KRERR_EOF;
return( FALSE );
}
ungetc( c, file_in );
return( TRUE );
}
/*****************************************************************************
FUNCTION : comma
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool comma(void)
{
register int c;
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
if (c == EOF) { KernelErrorCode = KRERR_EOF; return( FALSE ); }
if (c != ',') {
ungetc( c, file_in );
return( FALSE );
}
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
ungetc( c, file_in );
return( TRUE );
}
/*****************************************************************************
FUNCTION : get_nl
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool get_nl(void)
{
register int c;
do {
c = getc( file_in );
if (c == '\n') {
lineno++;
return( TRUE );
}
}
while ( isspace( c ) );
if (c == EOF) KernelErrorCode = KRERR_EOF;
else ungetc( c, file_in );
return( FALSE );
}
/*****************************************************************************
FUNCTION : get_pipe
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool get_pipe(void)
{
register int c;
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
if (c == '|') return( TRUE );
if (c == EOF) KernelErrorCode = KRERR_EOF;
else ungetc( c, file_in );
return( FALSE );
}
/*****************************************************************************
FUNCTION : skip_pipe
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool skip_pipe(void)
{
register int c;
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
if (c == '|') return( TRUE );
if (c == EOF) KernelErrorCode = KRERR_EOF;
else {
ungetc( c, file_in );
KernelErrorCode = KRERR_FILE_SYNTAX;
}
return( FALSE );
}
/*****************************************************************************
FUNCTION : get_alpha
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool get_alpha(void)
{
register int c;
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
if (c == EOF) KernelErrorCode = KRERR_EOF;
else {
ungetc( c, file_in );
if (isalpha( c )) return( TRUE );
}
return( FALSE );
}
/*****************************************************************************
FUNCTION : getSymbol
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool getSymbol(char *symbol)
{
register int c;
register char *s_ptr;
do {
c = getc( file_in );
if (c == '\n') lineno++;
}
while ( isspace( c ) );
if (c == EOF) {
KernelErrorCode = KRERR_EOF;
return( FALSE );
}
else {
s_ptr = symbol;
while (isgraph( c )) {
if ((c == ',') || (c == '|')) break;
*s_ptr++ = c;
c = getc( file_in );
}
ungetc( c, file_in );
*s_ptr = EOS;
if (s_ptr == symbol) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return( FALSE );
}
return( TRUE );
}
}
/*****************************************************************************
FUNCTION : getSection
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static char *getSection(char *line, int *title_no)
{
int i;
char *s1_ptr, *s2_ptr;
if ( !skipComments() )
{ /* EOF */
*title_no = -2;
return( NULL );
}
if (fgets( line, LIN_MAX, file_in ) == NULL)
{ /* I/O error */
*title_no = -3;
return( NULL );
}
for (i = 0; i < NoOfTitles; i++) {
s1_ptr = line;
s2_ptr = title[ i ];
while (*s2_ptr != EOS)
{ /* compare strings, don't examine white space */
if (*s1_ptr == ' ') s1_ptr++;
if (*s2_ptr == ' ') s2_ptr++;
if (*s1_ptr++ != *s2_ptr++) break;
if (*s2_ptr == EOS)
{ /* strings are equal */
*title_no = i;
return( s1_ptr );
}
}
}
*title_no = -1; /* title not found */
return( NULL );
}
/*****************************************************************************
FUNCTION : matchHead
PURPOSE : read /dev/null
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool matchHead(int N)
{
register int c;
int i;
c = getc( file_in );
if (c != '-') {
ungetc( c, file_in );
return( FALSE );
}
for (i = 0; i < N; i++) {
c = getc( file_in );
if (c != '-')
return( FALSE );
do
c = getc( file_in );
while ( c == '-' );
if (c != '|') { KernelErrorCode = KRERR_FILE_SYNTAX; return( FALSE ); }
}
c = getc( file_in );
if (c != '-') { KernelErrorCode = KRERR_FILE_SYNTAX; return( FALSE ); }
do
c = getc( file_in );
while ( c == '-' );
if (c == EOF) { KernelErrorCode = KRERR_EOF; return( FALSE ); }
ungetc( c, file_in );
if ( !get_nl() ) return( FALSE );
return( TRUE );
}
/*****************************************************************************
FUNCTION : matchHead2
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static bool matchHead2(int N)
{
if (!skipSpace()) return( FALSE );
return( matchHead(N) );
}
/*****************************************************************************
FUNCTION : my_strstr
PURPOSE : Find the first occurrence of find in s.
(slow version)
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static char *my_strstr(char *s, char *find)
{
register char c, sc;
register size_t len;
if ((c = *find++) != 0) {
len = strlen(find);
do {
do {
if ((sc = *s++) == 0) return (NULL);
}
while (sc != c);
}
while (strncmp(s, find, len) != 0);
s--;
}
return ((char *) s);
}
/*****************************************************************************
FUNCTION : krio_readHeader
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readHeader(char *netfile_version, char *net_name,
char *learn_func, char *update_func,
int *no_of_units, int *no_of_connect,
int *no_of_unitTypes, int *no_of_siteTypes)
{
char *cursor;
int ret_code, i, no_of_scan_params,
title_no;
ret_code = 1;
/* get file version */
cursor = getSection( fmt_shape1, &title_no );
if ((cursor == NULL) || (title_no != 0)) {
/* "SNNS network definition file" not found */
KernelErrorCode = KRERR_FILE_FORMAT;
return;
}
if (sscanf( cursor, "%s", netfile_version ) != 1) {
/* version string not found */
KernelErrorCode = KRERR_FILE_FORMAT;
return;
}
/* determine version number of the network file */
if (my_strstr( netfile_version, KERNEL3D_NETFILE_VERSION ) != NULL)
NetfileVersion = 1;
else
NetfileVersion = 0;
if (my_strstr( netfile_version, NETFILE_VERSION ) != NULL ||
my_strstr( netfile_version, NETFILE_VERSION2 ) != NULL)
/* current netfile version */
no_of_scan_params = 9;
else
no_of_scan_params = 8;
for (i = 0; i < no_of_scan_params; i++) {
if ( (cursor = getSection( fmt_shape1, &title_no )) == NULL) return;
switch (title_no) {
case -3: /* Physical I/O error */
KernelErrorCode = KRERR_IO;
return;
case -2: /* unexpected EOF */
KernelErrorCode = KRERR_EOF;
return;
case -1: /* not found */
KernelErrorCode = KRERR_FILE_FORMAT; /* Incompatible file format */
return;
case 1: /* "generated at" */
break;
case 2: /* network name" */
ret_code = sscanf( cursor, " :%s", net_name );
if ((ret_code != 1) && (ret_code != 0)) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (ret_code == 0) {
*net_name = EOS;
ret_code = 1;
}
break;
case 3: /* "no. of units" */
ret_code = sscanf( cursor, " :%d", no_of_units );
break;
case 4: /* "no. of connections" */
ret_code = sscanf( cursor, " :%d", no_of_connect );
break;
case 5: /* "no. of unit types" */
ret_code = sscanf( cursor, " :%d", no_of_unitTypes );
break;
case 6: /* "no. of site types" */
ret_code = sscanf( cursor, " :%d", no_of_siteTypes );
break;
case 7: /* "learning function" */
ret_code = sscanf( cursor, " :%s\n", learn_func );
if ((ret_code != 1) && (ret_code != 0)) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (ret_code == 0) {
*learn_func = '\0';
ret_code = 1;
}
break;
case 14: /* "source files" */
break;
case 16: /* "update function" */
ret_code = sscanf( cursor, " :%s\n", update_func );
if ((ret_code != 1) && (ret_code != 0)) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (ret_code == 0) {
*update_func = '\0';
ret_code = 1;
}
break;
default:
KernelErrorCode = KRERR_FILE_FORMAT; /* Incompatible file format */
return;
}
switch (ret_code) {
case 1: /* one argument matched */
break;
case EOF: /* unexpected EOF */
KernelErrorCode = KRERR_EOF;
return;
default: /* Syntax error at line */
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
lineno++;
}
}
/*****************************************************************************
FUNCTION : str_to_Ttype
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static int str_to_Ttype(char *str)
{
if (strcmp (str, "i" ) == 0) return (INPUT ) ;
if (strcmp (str, "o" ) == 0) return (OUTPUT ) ;
if (strcmp (str, "h" ) == 0) return (HIDDEN ) ;
if (strcmp (str, "d" ) == 0) return (DUAL ) ;
if (strcmp (str, "s" ) == 0) return (SPECIAL ) ;
if (strcmp (str, "si") == 0) return (SPECIAL_I) ;
if (strcmp (str, "so") == 0) return (SPECIAL_O) ;
if (strcmp (str, "sh") == 0) return (SPECIAL_H) ;
if (strcmp (str, "sd") == 0) return (SPECIAL_D) ;
return( 0 );
}
/*****************************************************************************
FUNCTION : krio_readSiteDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readSiteDefinitions(void)
{
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[0] ) != 0) ||
!matchHead2( 1 ) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
NoOfSiteTypes = 0;
while (TRUE) {
if (matchHead2( 1 )) return;
if (!skipComments()) return;
if (!getSymbol( fmt_shape1 )) return;
/* skip "|" character */
if (!skip_pipe()) return;
if (!getSymbol( fmt_shape2 )) return;
if (krui_createSiteTableEntry( fmt_shape1, fmt_shape2 ) != KRERR_NO_ERROR)
return;
NoOfSiteTypes++;
}
}
/*****************************************************************************
FUNCTION : krio_readTypeDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readTypeDefinitions(void)
{
int no_of_sites;
SymbolType *site_names = NULL;
char * *site_name_ptrs;
NoOfUnitTypes = 0;
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[1] ) != 0) ||
!matchHead2( 3 ) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (NoOfSiteTypes > 0) {
site_names = (SymbolType *)
calloc( (unsigned int) NoOfSiteTypes, sizeof (SymbolType) );
site_name_ptrs = (char * *)
calloc( (unsigned int) NoOfSiteTypes, sizeof (site_name_ptrs) );
if (site_names == NULL || site_name_ptrs == NULL) {
KernelErrorCode = KRERR_INSUFFICIENT_MEM;
return;
}
}
while (TRUE) {
if ( matchHead2( 3 ) ) break;
if ( !skipComments() ) break;
/* read unit type name, activation and output function */
if (fscanf( file_in, "%s | %s | %s",
fmt_shape1, fmt_shape2, fmt_shape3 ) != 3) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
/* skip "|" character */
if (!skip_pipe()) return;
NoOfUnitTypes++;
if (get_nl()) {
/* no sites */
if (krui_createFTypeEntry( fmt_shape1, fmt_shape2, fmt_shape3,
0, site_name_ptrs ) != KRERR_NO_ERROR)
return;
continue;
}
no_of_sites = 0;
while (TRUE) {
if (!getSymbol( site_names[ no_of_sites ] )) return;
site_name_ptrs[ no_of_sites ] = site_names[ no_of_sites ];
no_of_sites++;
if ( !comma() ) break;
if (no_of_sites > NoOfSiteTypes) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
}
if (krui_createFTypeEntry( fmt_shape1, fmt_shape2, fmt_shape3,
no_of_sites, site_name_ptrs ) != KRERR_NO_ERROR)
return;
}
if (site_names != NULL) {
free( (char *) site_names );
free( (char *) site_name_ptrs );
}
}
/*****************************************************************************
FUNCTION : krio_readDefaultDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readDefaultDefinitions(void)
{
FlintType act, bias;
int st, subnet_no, layer_no;
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[2] ) != 0) ||
!matchHead2( 6 ) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (fscanf( file_in, "%f | %f | %s | %d | %d | %s | %s",
&act, &bias, fmt_shape1, &subnet_no, &layer_no,
fmt_shape2, fmt_shape3 ) != 7) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if ( (st = str_to_Ttype( fmt_shape1 )) == 0) {
KernelErrorCode = KRERR_TTYPE;
return;
}
if (krui_setUnitDefaults( act, bias, st, subnet_no, layer_no,
fmt_shape2, fmt_shape3 ) != KRERR_NO_ERROR)
return;
if ( !matchHead2( 6 ) ) KernelErrorCode = KRERR_FILE_SYNTAX;
}
/*****************************************************************************
FUNCTION : krio_readUnitDefinitions
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readUnitDefinitions(void)
{
struct PosType pos;
FlintType fp;
int unit_no, def_unit_no, st, x, y, z;
bool is_ftype_unit;
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[3] ) != 0) ||
!matchHead2( 9 ) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
def_unit_no = 0;
while (TRUE) {
if ( matchHead2( 9 ) ) return;
if ( !skipComments() ) return;
/* read unit no. */
if (fscanf( file_in, "%d", &unit_no ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (unit_no != ++def_unit_no) {
KernelErrorCode = KRERR_UNIT_NO;
return;
}
/* skip "|" character */
if (!skip_pipe()) return;
/* read unit type name, if exist */
if (!get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read unit type name */
if (fscanf( file_in, "%s", fmt_shape1 ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
krui_createFTypeUnit( fmt_shape1 );
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* skip next "|" character */
if (!skip_pipe()) return;
is_ftype_unit = TRUE;
}
else {
if (krui_createDefaultUnit() != unit_no) {
KernelErrorCode = KRERR_MALLOC1;
return;
}
is_ftype_unit = FALSE;
}
/* read unit name, if exist */
if (!get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read unit name */
if (fscanf( file_in, "%s", fmt_shape1 ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (krui_setUnitName(def_unit_no, fmt_shape1) != KRERR_NO_ERROR) return;
/* skip next "|" character */
if (!skip_pipe()) return;
}
/* read unit's activation value, if exist */
if (!get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read unit activation value */
if (fscanf( file_in, "%f", &fp ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
krui_setUnitInitialActivation( def_unit_no, fp );
krui_setUnitActivation( def_unit_no, fp );
/* skip next "|" character */
if (!skip_pipe()) return;
}
/* read unit's bias value, if exist */
if (!get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read unit bias value */
if (fscanf( file_in, "%f", &fp ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
krui_setUnitBias( def_unit_no, fp );
/* skip next "|" character */
if (!skip_pipe()) return;
}
/* read unit's topologic type, if exist */
if (!get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read unit's topologic type */
if (fscanf( file_in, "%s", fmt_shape1 ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if ( (st = str_to_Ttype( fmt_shape1 )) == 0) {
KernelErrorCode = KRERR_TTYPE;
return;
}
if (krui_setUnitTType( def_unit_no, st ) != KRERR_NO_ERROR) return;
/* skip next "|" character */
if (!skip_pipe()) return;
}
/* read unit position */
switch (NetfileVersion) {
case 0:
if (fscanf( file_in, "%d , %d", &x, &y ) != 2) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
pos.x = (short) x;
pos.y = (short) y;
#ifdef KERNEL3D
pos.z = (short) 0;
#endif
krui_setUnitPosition( def_unit_no, &pos );
break;
case 1:
if (fscanf( file_in, "%d , %d, %d", &x, &y, &z ) != 3) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
pos.x = (short) x;
pos.y = (short) y;
#ifdef KERNEL3D
pos.z = (short) z;
#endif
krui_setUnitPosition( def_unit_no, &pos );
break;
}
/* skip "|" character */
if (!skip_pipe()) return;
if (is_ftype_unit) {
/* skip 2 "|" characters */
if (!skip_pipe()) return;
if (!skip_pipe()) return;
}
else {
/* read unit's activation function, if exist */
if (!get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read unit's activation function */
if (fscanf( file_in, "%s", fmt_shape1 ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (krui_setUnitActFunc( def_unit_no, fmt_shape1 ) != KRERR_NO_ERROR)
return;
/* skip next "|" character */
if (!skip_pipe()) return;
}
/* read unit's output function, if exist */
if (!get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read unit's output function */
if (fscanf( file_in, "%s", fmt_shape1 ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (krui_setUnitOutFunc( def_unit_no, fmt_shape1 ) != KRERR_NO_ERROR)
return;
/* skip next "|" character */
if (!skip_pipe()) return;
}
}
if (get_alpha()) {
/* a site name was detected */
if (krui_setCurrentUnit( def_unit_no ) != KRERR_NO_ERROR) return;
/* get site names */
while (TRUE) {
if (!getSymbol( fmt_shape1 )) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (krui_addSite( fmt_shape1 ) != KRERR_NO_ERROR) return;
if ( !comma() ) break;
}
}
}
}
/*****************************************************************************
FUNCTION : krio_readConnectionDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readConnectionDefs(void)
{
FlintType weight;
int unit_no, src_unit_no;
bool new_unit, unit_has_sites;
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[4] ) != 0) ||
(!matchHead2( 2 )) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
new_unit = TRUE;
unit_has_sites = FALSE;
while (TRUE) {
if ( matchHead2( 2 ) ) return;
if ( !skipComments() ) return;
if (new_unit) {
if (fscanf( file_in, "%d", &unit_no ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (krui_setCurrentUnit( unit_no ) != KRERR_NO_ERROR) return;
/* skip "|" character */
if (!skip_pipe()) return;
}
/* test for occurence of the "|" character, if exist the unit
has no sites */
if (unit_has_sites || !get_pipe()) {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* read site name */
if (fscanf( file_in, "%s", fmt_shape1 ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (krui_setSite( fmt_shape1 ) != KRERR_NO_ERROR) return;
unit_has_sites = TRUE;
/* following two lines were taken off between v1.3 and v1.5 of
this file. the result was that when reading artmap nets, there
occured a syntax error
*/
/* skip "|" character */
if (!skip_pipe()) return;
}
else
unit_has_sites = FALSE;
while (TRUE) {
/* read link weights */
if (fscanf( file_in, "%d : %f", &src_unit_no, &weight ) != 2) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (krui_createLink( src_unit_no, weight ) != KRERR_NO_ERROR) return;
if ( !comma() ) break;
}
if (unit_has_sites) {
if (get_alpha()) {
/* a new site name was found */
new_unit = FALSE;
}
else {
if (KernelErrorCode != KRERR_NO_ERROR) return;
/* a digit was read -> a new unit number was found */
new_unit = TRUE;
unit_has_sites = FALSE;
}
}
}
}
/*****************************************************************************
FUNCTION : krio_readSubnetDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readSubnetDefs(void)
{
int unit_no, subnet_no;
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[5] ) != 0) ||
!matchHead2( 1 ) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
while (TRUE) {
if (matchHead2( 1 )) return;
if ( !skipComments() ) return;
if (fscanf( file_in, "%d", &subnet_no ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if ( !get_pipe() ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
while (TRUE) {
if (fscanf( file_in, "%d", &unit_no ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (kr_getUnitPtr( unit_no ) == NULL) return;
krui_setUnitSubnetNo( unit_no, subnet_no );
if ( !comma() ) break;
}
}
}
/*****************************************************************************
FUNCTION : krio_readLayerDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void krio_readLayerDefs(void)
{
int unit_no, layer_no;
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[6] ) != 0) ||
!matchHead2( 1 ) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
while (TRUE) {
if (matchHead2( 1 )) return;
if ( !skipComments() ) return;
if (fscanf( file_in, "%d", &layer_no ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if ( !get_pipe() ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
while (TRUE) {
if (fscanf( file_in, "%d", &unit_no ) != 1) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
if (kr_getUnitPtr( unit_no ) == NULL) return;
krui_setUnitLayerNo( unit_no, (unsigned short) layer_no );
if ( !comma() ) break;
}
}
}
#ifdef KERNEL3D
/*****************************************************************************
FUNCTION : readXYTransTable
PURPOSE : read the XY-Tranlation Table from input file
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
static void readXYTransTable(void)
{
int x, y, z;
kr_xyTransTable( OP_TRANSTABLE_CLEAR, &x, &y, 0 );
if ( !skipComments() ) return;
if ((fscanf( file_in, headers[7] ) != 0) ||
!matchHead2( 2 ) ) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
while (TRUE) {
if (matchHead( 2 )) return;
if ( !skipComments() ) return;
if (fscanf( file_in, "%d | %d | %d", &x, &y, &z ) != 3) {
KernelErrorCode = KRERR_FILE_SYNTAX;
return;
}
(void) skipSpace();
kr_xyTransTable( OP_TRANSTABLE_SET, &x, &y, z );
}
}
#endif
/*****************************************************************************
FUNCTION : krio_readTimeDelayDefs
PURPOSE :
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
void krio_readTimeDelayDefs(void)
{
int u_no,
lln,
lun,
toff,
soff,
conn_type,
ret;
struct Unit *unit_ptr;
if ( !skipComments() ) return;
if (fscanf( file_in, headers[8] ) != 0)
{ KernelErrorCode = KRERR_FILE_SYNTAX; return; }
if ( !matchHead2( 5 ) )
{ KernelErrorCode = KRERR_FILE_SYNTAX; return; }
while (TRUE)
{
if (matchHead2( 5 )) return;
if ( !skipComments() ) return;
ret = fscanf (file_in, "%4d |%4d |%4d |%5d |%5d |%6d",
&u_no, &lln, &lun, &toff, &soff, &conn_type);
if (ret != 6) { KernelErrorCode = KRERR_FILE_SYNTAX; return; }
unit_ptr = kr_getUnitPtr (u_no);
unit_ptr->lln = lln;
unit_ptr->lun = lun;
unit_ptr->TD.target_offset = toff;
unit_ptr->TD.source_offset = soff;
unit_ptr->TD.td_connect_typ = conn_type;
unit_ptr++;
}
}
/*****************************************************************************
FUNCTION : krio_loadNet
PURPOSE : load network from disk
NOTES :
RETURNS :
UPDATE :
******************************************************************************/
krui_err krio_loadNet(char *filename, char **netname, char **netfile_version)
{
static char netname_str[81],
netfile_version_str[81],
learn_func[81],
update_func[81];
int no_units, no_connect, no_unitT,
no_siteT, title_no, status;
KernelErrorCode = KRERR_NO_ERROR;
lineno = status = 0;
file_in = fopen( filename, "r" );
if (file_in == NULL) {
KernelErrorCode = KRERR_FILE_OPEN; /* Can't open file */
goto end;
}
lineno = 1;
if (NoOfUnits > 0) krui_deleteNet();
krio_readHeader( netfile_version_str, netname_str, learn_func, update_func,
&no_units, &no_connect, &no_unitT, &no_siteT );
if (KernelErrorCode) goto end;
if(*learn_func != '\0') {
(void) krui_setLearnFunc( learn_func );
if (KernelErrorCode) goto end;
}
if(*update_func != '\0') {
(void) krui_setUpdateFunc( update_func );
if (KernelErrorCode) goto end;
}
*netname = netname_str;
*netfile_version = netfile_version_str;
while ( getSection( fmt_shape1, &title_no ) != NULL ) {
if (title_no >= 0) lineno++; /* increment line number */
switch (title_no) {
case -3: /* Physical I/O error */
KernelErrorCode = KRERR_IO;
return( KernelErrorCode );
case -2: /* EOF */
if (status < 2) KernelErrorCode = KRERR_EOF; /* unexpected EOF */
return( KernelErrorCode );
case -1: /* not found */
KernelErrorCode = KRERR_FILE_SYNTAX; /* Syntax error at line */
break;
case 8: /* "site definition section" */
krio_readSiteDefinitions();
break;
case 9: /* "type definition section" */
krio_readTypeDefinitions();
break;
case 10: /* "unit definition section" */
(void) krui_allocateUnits( no_units );
if (KernelErrorCode) goto end;
krio_readUnitDefinitions();
status++;
break;
case 11: /* "connection definition section" */
krio_readConnectionDefs();
status++;
break;
case 12: /* "subnet definition section" */
krio_readSubnetDefs();
break;
case 13: /* "unit default section" */
krio_readDefaultDefinitions();
break;
case 15: /* "layer definition section" */
krio_readLayerDefs();
break;
#ifdef KERNEL3D
case 17: /* "3D translation section" */
readXYTransTable();
break;
#endif
case 18: /* "time delay section" */
krio_readTimeDelayDefs ();
break;
default:
KernelErrorCode = KRERR_FILE_FORMAT; /* Incompatible file format */
break;
}
if (KernelErrorCode) break;
}
if (KernelErrorCode == KRERR_NO_ERROR) lineno = 0;
end:
if (file_in != NULL)
fclose( file_in );
return( KernelErrorCode );
}
/*#################################################
GROUP: Functions for Pattern Management
This group has been moved to kr_newpattern.c
#################################################*/
/*#################################################
GROUP: Functions for Result Management
#################################################*/
/*****************************************************************************
FUNCTION : krio_saveResult
PURPOSE : write result to disk
NOTES :
RETURNS :
UPDATE : now the actual update function is used instead of
Topological_Order (M. Vogt, 20.02.93, necessary for TD networks)
******************************************************************************/
krui_err krio_saveResult(char *filename, bool create, int startpattern,
int endpattern, bool includeinput, bool includeoutput)
{
char work_str[ LIN_MAX ];
float param_array[5];
struct Unit *unit_ptr;
long clock;
int ret, i, j;
int no_of_input_patterns, no_of_output_patterns;
Patterns in_pat, out_pat, save_in_pat;
krui_err temp_error;
int start, end, i_size, o_size, in_pat_size;
int pat,sub;
lineno = 1;
KernelErrorCode = KRERR_NO_ERROR;
if (krui_getNoOfPatterns() == 0)
{
KernelErrorCode = KRERR_NO_PATTERNS;
return( KernelErrorCode );
}
if (endpattern < startpattern || endpattern > krui_getNoOfPatterns())
{
return(KernelErrorCode = KRERR_PATTERN_NO);
}
/* calculate absolute numbers of first and last subpattern */
KernelErrorCode = kr_initSubPatternOrder(startpattern-1,endpattern-1);
if (KernelErrorCode != KRERR_NO_ERROR)
return( KernelErrorCode );
start = kr_AbsPosOfFirstSubPat(startpattern-1);
end = kr_AbsPosOfFirstSubPat(endpattern-1);
end += kr_NoOfSubPatPairs(endpattern-1)-1;
if (create)
file_out = fopen(filename, "w");
else
file_out = fopen(filename, "a");
if (file_out == NULL)
{ /* Can't open file */
KernelErrorCode = KRERR_FILE_OPEN;
return( KernelErrorCode );
}
KernelErrorCode = KRERR_IO;
/* write header and version number */
ret = fprintf( file_out, resHeader[0], krio_getIOVersion() );
RETCHKGTO( ret );
lineno++;
/* write date */
clock = 1;
(void) time( (time_t *) &clock);
strcpy( work_str, resHeader[1] );
strcat( work_str, " %s\n" );
ret = fprintf( file_out, work_str, ctime( (time_t *) &clock) );
RETCHKGTO( ret );
lineno++;
/* write no. of patterns, input units, output units */
strcpy( work_str, resHeader[2] );
strcat( work_str, resHeader[3] );
strcat( work_str, resHeader[4] );
ret = fprintf( file_out, work_str, end - start + 1,
krui_getNoOfInputUnits(), krui_getNoOfOutputUnits() );
RETCHKGTO( ret );
lineno += 3;
/* write numbers of used patterns */
strcpy( work_str, resHeader[5] );
strcat( work_str, resHeader[6] );
ret = fprintf( file_out, work_str, startpattern, endpattern);
RETCHKGTO( ret );
lineno += 2;
/* write additional format information */
if (includeinput)
{
ret = fprintf(file_out, resHeader[7]);
RETCHKGTO( ret );
lineno += 1;
}
if (includeoutput)
{
ret = fprintf(file_out, resHeader[8]);
RETCHKGTO( ret );
lineno += 1;
}
/* process network update for all subpattern */
for(i=start; i<=end;i++){
kr_getSubPatternByNo(&pat,&sub,i);
in_pat = kr_getSubPatData(pat,sub,INPUT,&i_size);
out_pat = kr_getSubPatData(pat,sub,OUTPUT,&o_size);
if (in_pat == (Patterns) NULL || out_pat == (Patterns) NULL)
goto end;
if (o_size == 0 && includeoutput)
{
KernelErrorCode = KRERR_NP_NO_OUTPUT_PATTERN;
goto end;
}
ret = fprintf( file_out, "#%d.%d\n", pat+1, sub+1 );
RETCHKGTO( ret );
if (includeinput)
{
save_in_pat = in_pat;
for (j = 1; j <= i_size; j++)
{
sprintf( work_str, "%.5f", *in_pat );
krio_cutTrailingZeros( work_str );
if (j < i_size)
if (j % 10 == 0)
strcat( work_str, "\n" );
else
strcat( work_str, " " );
ret = fputs( work_str, file_out );
RETCHKGTO( ret );
lineno++;
in_pat++;
}
fputs( "\n", file_out );
in_pat = save_in_pat;
}
if (includeoutput)
{
for (j = 1; j <= o_size; j++)
{
sprintf( work_str, "%.5f", *out_pat );
krio_cutTrailingZeros( work_str );
if (j < o_size)
if (j % 10 == 0)
strcat( work_str, "\n" );
else
strcat( work_str, " " );
ret = fputs( work_str, file_out );
RETCHKGTO( ret );
lineno++;
out_pat++;
}
fputs( "\n", file_out );
}
/* activate input layer */
in_pat_size = i_size;
FOR_ALL_UNITS( unit_ptr )
if ( IS_INPUT_UNIT( unit_ptr ) && UNIT_IN_USE( unit_ptr ))
if (in_pat_size--)
unit_ptr->act = *in_pat++;
/* propagate network */
if ((temp_error = krui_updateNet(param_array, 0)) != KRERR_NO_ERROR)
{
KernelErrorCode = temp_error;
goto end;
}
/* write network output */
j = 1;
FOR_ALL_UNITS( unit_ptr )
if UNIT_IN_USE( unit_ptr )
{
if IS_OUTPUT_UNIT( unit_ptr )
{
sprintf( work_str, "%.5f", unit_ptr->Out.output );
krio_cutTrailingZeros( work_str );
if (j < o_size)
if (j % 10 == 0)
strcat( work_str, "\n" );
else
strcat( work_str, " " );
j++;
ret = fputs( work_str, file_out );
RETCHKGTO( ret );
lineno++;
}
}
fputs( "\n", file_out );
}
end:
if (KernelErrorCode == KRERR_NO_ERROR)
lineno = 0;
if (fclose(file_out) != 0 && KernelErrorCode == KRERR_NO_ERROR)
KernelErrorCode = KRERR_IO;
return KernelErrorCode;
}